//
// Created by Administrator on 2021/11/29.
//

#ifndef STRINGUTIL_H
#define STRINGUTIL_H

#include <string>
#include <vector>
#include <regex>
#include <cstdarg>
#include "../core/MAssert.h"

#define STR_LENGTH 2048
#define SPACE " "

typedef std::string String;

class StringUtil {
public:

    /**
     * 字符在字符串中最开始出现的索引值
     * @param c 字符
     * @return 索引，如果不存在返回 -1
     */
    static int indexOf(std::string s, char c);

    /**
     * 字符在字符串中最后出现的索引值
     * @param c 字符
     * @return 索引，如果不存在返回 -1
     */
    static int lastIndexOf(std::string s, char c);

    /**
     * 截取字符串，原字符串不变
     * @param start 起始索引
     * @param len 长度
     * @return 截取后字符串
     */
    static std::string subStr(std::string s, unsigned int start,unsigned int len);

    /**
     * 字符串分割
     * @param splitStr 分隔符
     * @param outArray 分割后数组
     */
    static void split(std::string s, std::string splitStr, std::vector<std::string> &outArray);

    /**
     * 字符串分割
     * @param splitStr 分隔符
     */
    static std::vector<std::string> split(std::string s, std::string splitStr);

    /**
      * 字符串分割,支持正则表达式
      * @param regex 分隔符,支持正则表达式
      * @param outArray 分割后数组
     */
    static void splitWithRegex(std::string s, std::string regex, std::vector<std::string> &outArray);

    /**
    * 字符串分割
    * @param splitStr 分隔符
    */
    static std::vector<std::string> splitWithRegex(std::string s, std::string regex);

    /**
     * 获得类名
     */
    static std::string getClassName(const std::string& filePath);

    /**
     * 获取文件名+后缀
     * @param filePath 文件路径
     * @return 文件名+后缀
     */
    static std::string getFileName(const std::string& filePath);

    /**
     * int 转 字符串
     * @param i 数字
     * @return 字符串
     */
    static std::string toString(int i);

    /**
     * float 转 字符串
     * @param f 数字
     * @return 字符串
     */
    static std::string toString(float f);

    /**
     * 格式化字符串
     * @param fmt 模板
     * @param ... 变量
     * @return 格式化字符串
     */
    static std::string format(const char* fmt, ...);

    /**
     * 去除首尾空格
     * @return
     */
    static std::string trim(std::string s);

    /**
     * 判断是否以head开头
     * @param head
     * @return
     */
    static bool startWith(std::string s, std::string head);
};


#endif
